#!/bin/bash

# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 默认参数
OUTPUT_FILE="filesystem_static_info_$(date +%Y%m%d_%H%M%S).txt"

# 帮助信息
show_help() {
    echo "用法: $0 [选项]"
    echo "选项:"
    echo "  -o, --output <文件>   输出文件（默认: filesystem_static_info_时间戳.txt）"
    echo "  -h, --help           显示此帮助信息"
    exit 0
}

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -o|--output)
            OUTPUT_FILE="$2"
            shift 2
            ;;
        -h|--help)
            show_help
            ;;
        *)
            echo "未知选项: $1"
            show_help
            ;;
    esac
done

# 收集文件系统静态信息
collect_filesystem_static_info() {
    echo "=== Linux 文件系统静态信息 ===" > "$OUTPUT_FILE"
    echo "收集时间: $(date)" >> "$OUTPUT_FILE"
    echo "----------------------------------------" >> "$OUTPUT_FILE"
    
    # 文件系统基本信息
    echo -e "\n1. 文件系统基本信息:" >> "$OUTPUT_FILE"
    echo "----------------------------------------" >> "$OUTPUT_FILE"
    echo "挂载的文件系统:" >> "$OUTPUT_FILE"
    df -h >> "$OUTPUT_FILE"
    
    # 文件系统类型统计
    echo -e "\n2. 文件系统类型统计:" >> "$OUTPUT_FILE"
    echo "----------------------------------------" >> "$OUTPUT_FILE"
    echo "文件系统类型统计:" >> "$OUTPUT_FILE"
    df -T | awk 'NR>1 {print $2}' | sort | uniq -c | sort -nr >> "$OUTPUT_FILE"
    
    # 文件系统块设备信息
    echo -e "\n3. 文件系统块设备信息:" >> "$OUTPUT_FILE"
    echo "----------------------------------------" >> "$OUTPUT_FILE"
    echo "文件系统块设备信息:" >> "$OUTPUT_FILE"
    lsblk -f >> "$OUTPUT_FILE"
    
    # 文件系统详细信息
    echo -e "\n4. 文件系统详细信息:" >> "$OUTPUT_FILE"
    echo "----------------------------------------" >> "$OUTPUT_FILE"
    echo "文件系统详细信息:" >> "$OUTPUT_FILE"
    for mount in $(df -h | awk 'NR>1 {print $6}' | grep -v "tmpfs\|devtmpfs\|sysfs\|proc\|devpts\|securityfs\|pstore\|hugetlbfs\|mqueue\|debugfs\|tracefs"); do
        if [ -d "$mount" ]; then
            echo "挂载点: $mount" >> "$OUTPUT_FILE"
            # 获取挂载设备
            mount_device=$(mount | grep " $mount " | awk '{print $1}')
            echo "挂载设备: $mount_device" >> "$OUTPUT_FILE"
            echo "文件系统类型: $(df -T "$mount" | awk 'NR>1 {print $2}')" >> "$OUTPUT_FILE"
            echo "总大小: $(df -h "$mount" | awk 'NR>1 {print $2}')" >> "$OUTPUT_FILE"
            echo "已用: $(df -h "$mount" | awk 'NR>1 {print $3}')" >> "$OUTPUT_FILE"
            echo "可用: $(df -h "$mount" | awk 'NR>1 {print $4}')" >> "$OUTPUT_FILE"
            echo "使用率: $(df -h "$mount" | awk 'NR>1 {print $5}')" >> "$OUTPUT_FILE"
            
            # 添加inode信息
            echo "Inode信息:" >> "$OUTPUT_FILE"
            # 获取inode总数、已用和可用数
            inode_info=$(df -i "$mount" | awk 'NR>1')
            inode_total=$(echo "$inode_info" | awk '{print $2}')
            inode_used=$(echo "$inode_info" | awk '{print $3}')
            inode_avail=$(echo "$inode_info" | awk '{print $4}')
            inode_use_percent=$(echo "$inode_info" | awk '{print $5}')
            
            echo "  Inode总数: $inode_total" >> "$OUTPUT_FILE"
            echo "  已用Inode: $inode_used" >> "$OUTPUT_FILE"
            echo "  可用Inode: $inode_avail" >> "$OUTPUT_FILE"
            echo "  Inode使用率: $inode_use_percent" >> "$OUTPUT_FILE"
            
            echo "" >> "$OUTPUT_FILE"
        fi
    done
    
    # 文件系统参数
    echo -e "\n5. 文件系统参数:" >> "$OUTPUT_FILE"
    echo "----------------------------------------" >> "$OUTPUT_FILE"
    echo "文件系统参数:" >> "$OUTPUT_FILE"
    for mount in $(df -h | awk 'NR>1 {print $6}' | grep -v "tmpfs\|devtmpfs\|sysfs\|proc\|devpts\|securityfs\|pstore\|hugetlbfs\|mqueue\|debugfs\|tracefs"); do
        if [ -d "$mount" ]; then
            fs_type=$(df -T "$mount" | awk 'NR>1 {print $2}')
            # 获取挂载设备
            mount_device=$(mount | grep " $mount " | awk '{print $1}')
            echo "挂载点: $mount ($fs_type)" >> "$OUTPUT_FILE"
            echo "挂载设备: $mount_device" >> "$OUTPUT_FILE"
            
            # 获取挂载选项 - 使用更精确的方法
            # 使用findmnt命令获取特定挂载点的选项
            if command -v findmnt &>/dev/null; then
                mount_options=$(findmnt -n -o OPTIONS "$mount" 2>/dev/null)
                if [ -z "$mount_options" ]; then
                    # 如果findmnt失败，尝试使用mount命令
                    mount_options=$(mount | grep " $mount " | awk '{print $6}' | sed 's/(//g' | sed 's/)//g')
                fi
            else
                # 如果没有findmnt命令，使用mount命令
                mount_options=$(mount | grep " $mount " | awk '{print $6}' | sed 's/(//g' | sed 's/)//g')
            fi
            echo "挂载选项: $mount_options" >> "$OUTPUT_FILE"
            
            # 获取文件系统特定参数
            case "$fs_type" in
                ext2|ext3|ext4)
                    if [ -f "/sys/fs/$fs_type/features" ]; then
                        echo "文件系统特性:" >> "$OUTPUT_FILE"
                        cat "/sys/fs/$fs_type/features" >> "$OUTPUT_FILE"
                    fi
                    if [ -f "/sys/fs/$fs_type/options" ]; then
                        echo "文件系统选项:" >> "$OUTPUT_FILE"
                        cat "/sys/fs/$fs_type/options" >> "$OUTPUT_FILE"
                    fi
                    
                    # 获取ext2/ext3/ext4详细信息
                    if command -v tune2fs &>/dev/null; then
                        echo "Ext文件系统详细信息:" >> "$OUTPUT_FILE"
                        tune2fs -l "$mount_device" >> "$OUTPUT_FILE"
                    else
                        echo "无法获取Ext文件系统详细信息: tune2fs命令不可用" >> "$OUTPUT_FILE"
                    fi
                    ;;
                xfs)
                    if command -v xfs_info &>/dev/null; then
                        echo "XFS信息:" >> "$OUTPUT_FILE"
                        xfs_info "$mount" >> "$OUTPUT_FILE"
                    fi
                    ;;
                btrfs)
                    if command -v btrfs &>/dev/null; then
                        echo "Btrfs信息:" >> "$OUTPUT_FILE"
                        btrfs filesystem show "$mount" >> "$OUTPUT_FILE"
                    fi
                    ;;
                *)
                    echo "无法获取 $fs_type 的特定参数" >> "$OUTPUT_FILE"
                    ;;
            esac
            echo "" >> "$OUTPUT_FILE"
        fi
    done
    
    # 文件系统内核参数
    echo -e "\n6. 文件系统内核参数:" >> "$OUTPUT_FILE"
    echo "----------------------------------------" >> "$OUTPUT_FILE"
    echo "文件系统内核参数:" >> "$OUTPUT_FILE"
    
    # 检查sysctl命令是否可用
    if command -v sysctl &>/dev/null; then
        # 文件描述符相关参数
        echo "文件描述符参数:" >> "$OUTPUT_FILE"
        echo "  fs.file-max: $(sysctl -n fs.file-max)" >> "$OUTPUT_FILE"
        echo "  fs.nr_open: $(sysctl -n fs.nr_open)" >> "$OUTPUT_FILE"
        
        # 文件系统缓存相关参数
        echo "文件系统缓存参数:" >> "$OUTPUT_FILE"
        echo "  vm.dirty_ratio: $(sysctl -n vm.dirty_ratio)" >> "$OUTPUT_FILE"
        echo "  vm.dirty_background_ratio: $(sysctl -n vm.dirty_background_ratio)" >> "$OUTPUT_FILE"
        echo "  vm.dirty_expire_centisecs: $(sysctl -n vm.dirty_expire_centisecs)" >> "$OUTPUT_FILE"
        echo "  vm.dirty_writeback_centisecs: $(sysctl -n vm.dirty_writeback_centisecs)" >> "$OUTPUT_FILE"
        
        # 文件系统性能相关参数
        echo "文件系统性能参数:" >> "$OUTPUT_FILE"
        echo "  fs.inotify.max_user_watches: $(sysctl -n fs.inotify.max_user_watches)" >> "$OUTPUT_FILE"
        echo "  fs.inotify.max_user_instances: $(sysctl -n fs.inotify.max_user_instances)" >> "$OUTPUT_FILE"
        echo "  fs.inotify.max_queued_events: $(sysctl -n fs.inotify.max_queued_events)" >> "$OUTPUT_FILE"
        
        # 虚拟内存相关参数
        echo "虚拟内存参数:" >> "$OUTPUT_FILE"
        echo "  vm.swappiness: $(sysctl -n vm.swappiness)" >> "$OUTPUT_FILE"
        echo "  vm.vfs_cache_pressure: $(sysctl -n vm.vfs_cache_pressure)" >> "$OUTPUT_FILE"
        
        # 尝试获取ext4特定参数（如果存在）
        if [ -f "/proc/sys/fs/ext4/max_batch_time" ]; then
            echo "Ext4特定参数:" >> "$OUTPUT_FILE"
            echo "  fs.ext4.max_batch_time: $(sysctl -n fs.ext4.max_batch_time)" >> "$OUTPUT_FILE"
            echo "  fs.ext4.min_batch_time: $(sysctl -n fs.ext4.min_batch_time)" >> "$OUTPUT_FILE"
            echo "  fs.ext4.journal_async_commit: $(sysctl -n fs.ext4.journal_async_commit)" >> "$OUTPUT_FILE"
        fi
        
        # 尝试获取XFS特定参数（如果存在）
        if [ -f "/proc/sys/fs/xfs/xfs_buf_timer_centisecs" ]; then
            echo "XFS特定参数:" >> "$OUTPUT_FILE"
            echo "  fs.xfs.xfs_buf_timer_centisecs: $(sysctl -n fs.xfs.xfs_buf_timer_centisecs)" >> "$OUTPUT_FILE"
            echo "  fs.xfs.xfs_buf_age_centisecs: $(sysctl -n fs.xfs.xfs_buf_age_centisecs)" >> "$OUTPUT_FILE"
        fi
    else
        echo "无法获取内核参数: sysctl命令不可用" >> "$OUTPUT_FILE"
    fi
    
    echo -e "\n静态信息收集完成，已保存到: $OUTPUT_FILE"
}

# 收集文件系统静态信息
echo -e "${BLUE}正在收集文件系统静态信息...${NC}"
collect_filesystem_static_info

echo -e "${GREEN}文件系统静态信息收集完成，已保存到: $OUTPUT_FILE${NC}" 